// 需要额外的空间 O(m+n)
; (function () {
    //return
    /**
   * @param {number[][]} matrix
   * @return {void} Do not return anything, modify matrix in-place instead.
   */
    var setZeroes = function (matrix) {
        let row = new Array(matrix.length).fill(null)
        let column = new Array(matrix[0].length).fill(null)

        for (let index = 0; index < matrix.length; index++) {
            // 这里的index是row
            const element = matrix[index];

            for (let val = 0; val < element.length; val++) {
                // 这里的index是column
                const item = element[val];

                if (item == 0) {
                    row[index] = 0
                    column[val] = 0
                }

            }

        }
        for (let index = 0; index < matrix.length; index++) {
            // 这里的index是row 行
            const element = matrix[index];

            for (let val = 0; val < element.length; val++) {
                // 这里的index是column 列
                if (row[index] === 0) {
                    element[val] = 0
                }
                if (column[val] === 0) {
                    element[val] = 0
                }

            }

        }
        return matrix
        // console.log(row,column)
    };
    let a = [[1, 1, 1], [1, 0, 1], [1, 1, 1]]

    let result = setZeroes(a)
    console.log(result);
})();

// 通过改变当前数组的第一列和第一行的当前数为零
// 在判断自己是否需要变成零
// 最后在判断第一列和第一行是否需要变为零
// 这样空间的O(1)
; (function () {
    //return

    /**
   * @param {number[][]} matrix
   * @return {void} Do not return anything, modify matrix in-place instead.
   */
    var setZeroes = function (matrix) {
        let firstRowHasZero = false, firstColHasZero = false
        let m = matrix.length, n = matrix[0].length
        for (let i = 0; i < m; i++) {
            // 每行的第一个是否有零
            if (matrix[i][0] === 0) {
                firstRowHasZero = true
            }
        }
        for (let j = 0; j < n; j++) {
            // 第一列当中是否有零
            if (matrix[0][j] === 0) {
                firstColHasZero = true
            }
        }
        for (let r = 1; r < m; r++) {
            for (let c = 1; c < n; c++) {

                if (matrix[r][c] === 0) {
                    // 这一步相当于把, 当前的行和列的首位改变成0
                    matrix[r][0] = matrix[0][c] = 0
                }
            }
        }
        for (let r = 1; r < m; r++) {
            for (let c = 1; c < n; c++) {
                // 根据行和列的首位是否为零,来判断当前位置是否变成零
                if (matrix[r][0] === 0 || matrix[0][c] === 0) {
                    matrix[r][c] = 0
                }
            }
        }

        // 这个不是先判断的原因是因为,如果先改变成了零, 
        // 第二列和第二行即之后的行和列无法判断,当前的零是不是内部改变首位的操作了

        // firstRowHasZero这个为真时, 说明第一列应该全部为零
        if (firstRowHasZero) {
            for (let i = 0; i < m; i++) {
                matrix[i][0] = 0
            }
        }
        // firstRowHasZero这个为真时, 说明第一行应该全部为零
        if (firstColHasZero) {
            for (let j = 0; j < n; j++) {
                matrix[0][j] = 0
            }
        }
        return matrix
    };
})();